#include "cryptutils.h"

// CryptUtils 实现
QString CryptUtils::generateMD5(const QString &data)
{
    QByteArray arr = QCryptographicHash::hash(data.toUtf8(), QCryptographicHash::Md5);
    return arr.toHex();
}

QString CryptUtils::generateEncryptedMessage(const QString &username, const QString &salt)
{
    // 构建MD5
    QString data = username + salt;
    QString md5Hash = generateMD5(data);
    
    // 组成加密密文
    QString encryptedMessage = salt + "$" + md5Hash;
    return encryptedMessage;
}

QString CryptUtils::generateToken(const QString &data, const QString &secret)
{
    QString tokenData = data + secret + QString::number(QDateTime::currentMSecsSinceEpoch());
    return generateMD5(tokenData);
}

// KVQuery 实现
KVQuery::KVQuery(const QString &secret)
{
    _map.insert("secret", secret);
    _map.insert("t", QString::number(QDateTime::currentMSecsSinceEpoch()));
}

void KVQuery::add(const QString &key, const QString &value)
{
    _map.insert(key, value);
}

void KVQuery::erase(const QString &key)
{
    _map.remove(key);
}

void KVQuery::clear()
{
    _map.clear();
}

QString KVQuery::toString() const
{
    // 转换为url中查询参数的格式
    QString tmp;
    for (auto it = _map.begin(); it != _map.end(); ++it) {
        tmp.append(it.key()).append("=").append(it.value()).append("&");
    }
    tmp.chop(1); // 移除最后一个&
    return tmp;
}

QString KVQuery::getQueryParameter()
{
    QString token = CryptUtils::generateMD5(toString());
    erase("secret"); // 去掉secret
    QString res = toString();
    res.append("&token=").append(token);
    return res;
}